<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><meta http-equiv="Content-Language" content="zh-CN"><title>systemd-coredump
  中文手册 [金步国]</title><style>
@font-face { font-family: "JinBuGuoWebMono"; src: url("http://www.jinbuguo.com/d/mono.ttf") format("truetype"); }
* { font-family: "JinBuGuoWebMono", "Ubuntu Mono", "Consolas", "Menlo", monospace; }
body { margin:10px; }
h1 { text-align:center; background:#ddd; }
h2#auth_name { text-align:center; margin: 10px 5%; }

    a.headerlink {
      color: #c60f0f;
      font-size: 0.8em;
      padding: 0 4px 0 4px;
      text-decoration: none;
      visibility: hidden;
    }

    a.headerlink:hover {
      background-color: #c60f0f;
      color: white;
    }

    h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, dt:hover > a.headerlink {
      visibility: visible;
    }
</style><script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><h1>systemd-coredump 中文手册</h1><h2 id="auth_name">译者：<strong><a href="http://www.jinbuguo.com/">金步国</a></strong></h2><hr><h3>版权声明</h3><p>本文译者是一位开源理念的坚定支持者，所以本文虽然不是软件，但是遵照开源的精神发布。</p><ul><li>无担保：本文译者不保证译文内容准确无误，亦不承担任何由于使用此文档所导致的损失。</li><li>自由使用：任何人都可以自由的<u>阅读/链接/打印</u>此文档，无需任何附加条件。</li><li>名誉权：任何人都可以自由的<u>转载/引用/再创作</u>此文档，但必须保留译者署名并注明出处。</li></ul><h3>其他作品</h3><p>本文译者十分愿意与他人分享劳动成果，如果你对我的其他翻译作品或者技术文章有兴趣，可以在如下位置查看现有的作品集：</p><ul><li><a href="http://www.jinbuguo.com/">金步国作品集</a> [ <a href="http://www.jinbuguo.com/">http://www.jinbuguo.com/</a> ]</li></ul><h3>联系方式</h3><p>由于译者水平有限，因此不能保证译文内容准确无误。如果你发现了译文中的错误(哪怕是错别字也好)，请来信指出，任何提高译文质量的建议我都将虚心接纳。</p><ul><li>Email(QQ)：70171448在QQ邮箱</li></ul><hr><a href="systemd.index.html">手册索引</a> ·
  <a href="systemd.directives.html">指令索引</a><span style="float:right">systemd-241</span><hr><div class="refentry"><a name="systemd-coredump"></a><div class="titlepage"></div><div class="refnamediv"><h2>名称</h2><p>systemd-coredump, systemd-coredump.socket, systemd-coredump@.service — 获取、保存、处理内存转储</p></div><div class="refsynopsisdiv"><h2>大纲</h2><p><code class="filename">/usr/lib/systemd/systemd-coredump</code></p><p><code class="filename">/usr/lib/systemd/systemd-coredump</code> <code class="option">--backtrace</code></p><p><code class="filename">systemd-coredump@.service</code></p><p><code class="filename">systemd-coredump.socket</code></p></div><div class="refsect1"><a name="id-1.5"></a><h2 id="描述">描述<a class="headerlink" title="Permalink to this headline" href="systemd-coredump.html#%E6%8F%8F%E8%BF%B0">¶</a></h2><p><code class="filename">systemd-coredump@.service</code> 是一个系统服务，
    它能从操作系统内核中获取内存转储，并能对获取到的数据进行各种处理。该服务的功能实际由 <span class="command"><strong>systemd-coredump</strong></span>
    可执行程序实现，该程序被先后调用两次：第一次被操作系统内核作为内存转储处理器调用；
    第二次被 <code class="filename">systemd-coredump@.service</code> 服务调用，
    用于将获取到的数据写入文件或日志中。</p><p>当操作系统内核调用 <span class="command"><strong>systemd-coredump</strong></span> 来处理内存转储时，
    它将以特权模式运行，并连接到
    <code class="filename">systemd-coredump.socket</code> 单元创建的套接字上，接着再派生一个非特权模式的
    <code class="filename">systemd-coredump@.service</code> 实例来处理所获取的内存转储。可见，
    <code class="filename">systemd-coredump.socket</code> 与 <code class="filename">systemd-coredump@.service</code>
    是为了实现对内存转储进行统一管理而
    专门设置的辅助单元。</p><p>内存转储既可以保存到日志中，也可以保存到单独的文件中，
    以便于将来被例如
    <a href="http://man7.org/linux/man-pages/man1/gdb.1.html"><span class="citerefentry"><span class="refentrytitle">gdb</span>(1)</span></a> 这样的工具做进一步的分析和处理。
    </p><p>默认情况下，<span class="command"><strong>systemd-coredump</strong></span> 会把内存转储事件以及可能存在的回溯(backtrace)保存到日志中，
    同时把内存转储自身的数据(内存镜像)保存到外部的
    <code class="filename">/var/lib/systemd/coredump/</code> 目录中。</p><p>进程在接收到信号后的行为
    取决于某些特定的因素(详见
    <a href="http://man7.org/linux/man-pages/man5/core.5.html"><span class="citerefentry"><span class="refentrytitle">core</span>(5)</span></a> 手册)，
    特别需要注意的是，仅在相关系统资源充足且未超出资源限制的前提下，才会进行内存转储操作。
    </p><p>如果在调用 <span class="command"><strong>systemd-coredump</strong></span> 时使用了
    <code class="option">--backtrace</code> 选项，那么在 <span class="command"><strong>systemd-coredump</strong></span>
    的标准输入(STDIN)上必须存在一条符合
    <a class="ulink" href="https://www.freedesktop.org/wiki/Software/systemd/export" target="_top">Journal Export Format</a>
    格式的日志，这条日志必须包含一个 <code class="varname">MESSAGE=</code> 字段，
    并且任何其他元数据字段在调用者看来都必须是合情合理的。 <span class="command"><strong>systemd-coredump</strong></span>
    将会按照它自己从内核中接收内存转储的方式，在这条日志中添加额外的元数据字段。
    注意，在这种模式下，内存转储将不会保存在日志中。</p></div><div class="refsect1"><a name="id-1.6"></a><h2 id="配置">配置<a class="headerlink" title="Permalink to this headline" href="systemd-coredump.html#%E9%85%8D%E7%BD%AE">¶</a></h2><p>对于被 <span class="command"><strong>systemd</strong></span> 进程启动的程序来说，可以通过
    <code class="varname">LimitCore=</code> 指令来设置资源限制，详见
    <a href="systemd.exec.html#"><span class="citerefentry"><span class="refentrytitle">systemd.exec</span>(5)</span></a> 手册。
    </p><p>为了被操作系统内核用作内存转储处理器，
    <span class="command"><strong>systemd-coredump</strong></span> 必须被配置到
    <a href="http://man7.org/linux/man-pages/man8/sysctl.8.html"><span class="citerefentry"><span class="refentrytitle">sysctl</span>(8)</span></a>
    的 <code class="varname">kernel.core_pattern</code> 变量中。此变量的语法详见
    <a href="http://man7.org/linux/man-pages/man5/core.5.html"><span class="citerefentry"><span class="refentrytitle">core</span>(5)</span></a> 手册。
    systemd 安装的 <code class="filename">/usr/lib/sysctl.d/50-coredump.conf</code> 文件就依据该语法配置了
    <code class="varname">kernel.core_pattern</code> 变量的默认值。
    如果想要使用不同的配置，那么可以根据
    <a href="sysctl.d.html#"><span class="citerefentry"><span class="refentrytitle">sysctl.d</span>(5)</span></a>
    规则来屏蔽或覆盖此文件。修改 sysctl 配置之后，必须要刷新内核参数才能真正生效，
    详见
    <a href="http://man7.org/linux/man-pages/man8/sysctl.8.html"><span class="citerefentry"><span class="refentrytitle">sysctl</span>(8)</span></a>
    与
    <a href="systemd-sysctl.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-sysctl.service</span>(8)</span></a> 手册。
    </p><p>如果想要以 <code class="option">--backtrace</code> 模式运行，那么必须在发送端安装一个适当的回溯处理程序(backtrace
    handler)。例如，对于
    <a href="https://linux.die.net/man/1/python"><span class="citerefentry"><span class="refentrytitle">python</span>(1)</span></a> 来说，
    这就意味着必须安装一个 <code class="varname">sys.excepthook</code> 钩子，详见
    <a class="ulink" href="https://github.com/keszybz/systemd-coredump-python" target="_top">systemd-coredump-python</a> 手册。
    </p><p> <span class="command"><strong>systemd-coredump</strong></span> 自身的行为由
    <code class="filename">/etc/systemd/coredump.conf</code> 配置文件与对应的
    <code class="filename">/etc/systemd/coredump.conf.d/*.conf</code> 配置片段共同决定，详见
    <a href="coredump.conf.html#"><span class="citerefentry"><span class="refentrytitle">coredump.conf</span>(5)</span></a> 手册。
    因为每发生一次内核转储都会调用一个 <span class="command"><strong>systemd-coredump</strong></span> 新实例，
    所以，这些配置文件的变化将会立即体现在下一次内核转储调用调用的新实例上。</p><p>内核转储文件所占用的磁盘资源受两种不同方式的约束：
    (1)占用磁盘空间的大小受 <code class="filename">/etc/systemd/coredump.conf</code> 配置文件以及对应的配置片段的约束；
    (2)占用磁盘时间的长短受 <span class="command"><strong>systemd-tmpfiles</strong></span> 配置的约束(对应的配置文件默认位于
     <code class="filename">/usr/lib/tmpfiles.d/systemd.conf</code>)。</p><div class="refsect2"><a name="id-1.6.7"></a><h3 id="禁止处理内核转储">禁止处理内核转储<a class="headerlink" title="Permalink to this headline" href="systemd-coredump.html#%E7%A6%81%E6%AD%A2%E5%A4%84%E7%90%86%E5%86%85%E6%A0%B8%E8%BD%AC%E5%82%A8">¶</a></h3><p>如果想要避免 <span class="command"><strong>systemd-coredump</strong></span> 在处理内核转储时对系统资源的大量占用，
      那么可以将 </p><pre class="programlisting">Storage=none
ProcessSizeMax=0</pre><p> 写入
      <a href="coredump.conf.html#"><span class="citerefentry"><span class="refentrytitle">coredump.conf</span>(5)</span></a> 中。
      </p></div></div><div class="refsect1"><a name="id-1.7"></a><h2 id="用法">用法<a class="headerlink" title="Permalink to this headline" href="systemd-coredump.html#%E7%94%A8%E6%B3%95">¶</a></h2><p>存储在日志中的数据，可以按照常规使用
    <a href="journalctl.html#"><span class="citerefentry"><span class="refentrytitle">journalctl</span>(1)</span></a>
    进行查看。
    <a href="coredumpctl.html#"><span class="citerefentry"><span class="refentrytitle">coredumpctl</span>(1)</span></a>
    可以用于提取已保存的内存转储，而不必关心实际的保存方式与位置。
    如果想要显示相关信息或做进一步处理，可以将输出内容管道传递给例如 gdb 这样的工具。</p></div><div class="refsect1"><a name="id-1.8"></a><h2 id="参见">参见<a class="headerlink" title="Permalink to this headline" href="systemd-coredump.html#%E5%8F%82%E8%A7%81">¶</a></h2><p>
      <a href="coredump.conf.html#"><span class="citerefentry"><span class="refentrytitle">coredump.conf</span>(5)</span></a>,
      <a href="coredumpctl.html#"><span class="citerefentry"><span class="refentrytitle">coredumpctl</span>(1)</span></a>,
      <a href="systemd-journald.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-journald.service</span>(8)</span></a>,
      <a href="systemd-tmpfiles.html#"><span class="citerefentry"><span class="refentrytitle">systemd-tmpfiles</span>(8)</span></a>,
      <a href="http://man7.org/linux/man-pages/man5/core.5.html"><span class="citerefentry"><span class="refentrytitle">core</span>(5)</span></a>,
      <a href="sysctl.d.html#"><span class="citerefentry"><span class="refentrytitle">sysctl.d</span>(5)</span></a>,
      <a href="systemd-sysctl.service.html#"><span class="citerefentry"><span class="refentrytitle">systemd-sysctl.service</span>(8)</span></a>.
    </p></div></div></body></html>
